#include "controlpanel.h"
#include <QDrag>
#include <QMimeData>
#include <QMouseEvent>
#include <QDebug>

#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonValue>

ControlPanel::ControlPanel(QWidget *parent) : QWidget(parent)
{
    // 创建设备树控件
    deviceTree = new MyDeviceTree(this);
    deviceTree->setHeaderLabel("设备列表");

    // 创建分组项
    ballMachineItem = new QTreeWidgetItem(deviceTree, QStringList("球机"));
    gunCameraItem = new QTreeWidgetItem(deviceTree, QStringList("枪机"));

    // 设置为顶级项
    ballMachineItem->setExpanded(true);
    gunCameraItem->setExpanded(true);

    // 布局
    QVBoxLayout *layout = new QVBoxLayout(this);
    layout->addWidget(deviceTree);
    setLayout(layout);

    initDeviceTreeDrag();
    connect(deviceTree , &QTreeWidget::itemClicked , this , &ControlPanel::onDeviceItemClicked);
}

ControlPanel::~ControlPanel()
{}

// 初始化设备树的拖拽功能
void ControlPanel::initDeviceTreeDrag()
{
    // 启用设备树的拖拽
    deviceTree->setDragEnabled(true);
    deviceTree->setDragDropMode(QAbstractItemView::DragOnly);
}

// 设备树项展开时触发
void ControlPanel::onItemExpanded(QTreeWidgetItem *item)
{
    QString itemType = item->data(0, Qt::UserRole).toString();

    // 如果是球机分组
    if (itemType == "group_dome" && item->childCount() == 0) {
        // 添加球机子项
        for (int i = 1; i <= 4; ++i) {
            QTreeWidgetItem *camera = new QTreeWidgetItem(item);
            camera->setText(0, QString("球机%1").arg(i));
            camera->setText(1, "在线");
            camera->setText(2, QString("192.168.1.%1").arg(100 + i));
            // 设置设备ID作为用户数据
            camera->setData(0, Qt::UserRole, QString("dome_%1").arg(i));
            // 设置图标（可选）
            // camera->setIcon(0, QIcon(":/icons/camera.png"));
        }
    }
    // 如果是枪机分组
    else if (itemType == "group_bullet" && item->childCount() == 0) {
        // 添加枪机子项
        for (int i = 1; i <= 4; ++i) {
            QTreeWidgetItem *camera = new QTreeWidgetItem(item);
            camera->setText(0, QString("枪机%1").arg(i));
            camera->setText(1, "在线");
            camera->setText(2, QString("192.168.2.%1").arg(100 + i));
            // 设置设备ID作为用户数据
            camera->setData(0, Qt::UserRole, QString("bullet_%1").arg(i));
            // 设置图标（可选）
            // camera->setIcon(0, QIcon(":/icons/camera.png"));
        }
    }
}

QTreeWidget* ControlPanel::getDeviceTree() const
{
    return deviceTree;
}
/*
void ControlPanel::setDeviceList(const QString& deviceListJson)
{
    // 清空现有设备列表
    ballMachineItem->takeChildren();
    gunCameraItem->takeChildren();

    // 解析JSON数据
    QJsonDocument jsonDoc = QJsonDocument::fromJson(deviceListJson.toUtf8());

    if (!jsonDoc.isNull() && jsonDoc.isArray()) {
        QJsonArray deviceArray = jsonDoc.array();
        // 遍历设备列表
        for (const QJsonValue& value : deviceArray) {
            if (value.isObject()) {
                QJsonObject deviceObj = value.toObject();

                // 根据数据库表结构提取设备信息
                int id = deviceObj["camera_id"].toString().toInt();           // camera_id
                qDebug() << id ;
                qDebug() << deviceObj["camera_id"] ;
                int type = deviceObj["camera_type"].toString().toInt();       // camera_type (0:球机, 1:枪机)
                qDebug() << type ;
                QString serial = deviceObj["camera_serial_no"].toString();  // camera_serial_no
                qDebug() << serial ;
                int channelCount = deviceObj["camera_channels"].toString().toInt();    // camera_channels
                qDebug() << channelCount ;

                QString ip = deviceObj["camera_ip"].toString();    // camera_ip
                qDebug() << ip ;
                QString rtmp = deviceObj["rtmp"].toString();       // rtmp
                qDebug() << rtmp ;
                // 创建设备项
                QStringList itemData;
                itemData << QString("%1 (%2)").arg(serial).arg(id);
                QTreeWidgetItem *deviceItem = new QTreeWidgetItem(itemData);

                // 添加详细信息作为子项
                new QTreeWidgetItem(deviceItem, QStringList(QString("通道数: %1").arg(channelCount)));
                new QTreeWidgetItem(deviceItem, QStringList(QString("IP: %1").arg(ip)));
                new QTreeWidgetItem(deviceItem, QStringList(QString("RTMP: %1").arg(rtmp)));

                // 根据设备类型添加到对应分组
                // camera_type: 0表示球机，1表示枪机
                if (type == 0) {
                    ballMachineItem->addChild(deviceItem);
                } else if (type == 1) {
                    gunCameraItem->addChild(deviceItem);
                } else {
                    // 默认添加到球机分组
                    ballMachineItem->addChild(deviceItem);
                }
            }
        }
    } else {
        qDebug() << "Failed to parse device list JSON or invalid format";
    }
}
*/

void ControlPanel::setDeviceList(const QString& deviceListJson)
{
    // 清空现有设备列表
    ballMachineItem->takeChildren();
    gunCameraItem->takeChildren();

    // 解析JSON数据
    QJsonDocument jsonDoc = QJsonDocument::fromJson(deviceListJson.toUtf8());

    if (!jsonDoc.isNull() && jsonDoc.isArray()) {
        QJsonArray deviceArray = jsonDoc.array();
        // 遍历设备列表
        for (const QJsonValue& value : deviceArray) {
            if (value.isObject()) {
                QJsonObject deviceObj = value.toObject();

                // 根据数据库表结构提取设备信息
                int id = deviceObj["camera_id"].toString().toInt();
                int type = deviceObj["camera_type"].toString().toInt();
                QString serial = deviceObj["camera_serial_no"].toString();
                int channelCount = deviceObj["camera_channels"].toString().toInt();
                QString ip = deviceObj["camera_ip"].toString();
                QString rtmp = deviceObj["rtmp"].toString();

                // 创建设备项
                QStringList itemData;
                itemData << QString("%1 (%2)").arg(serial).arg(id);
                QTreeWidgetItem *deviceItem = new QTreeWidgetItem(itemData);

                // 为每个设备添加主码流和子码流子项
                QTreeWidgetItem *mainStreamItem = new QTreeWidgetItem(deviceItem);
                mainStreamItem->setText(0, "主码流");
                // 存储带码流标识的RTMP URL (主码流为0)
                mainStreamItem->setData(0, Qt::UserRole, rtmp + "0");

                QTreeWidgetItem *subStreamItem = new QTreeWidgetItem(deviceItem);
                subStreamItem->setText(0, "子码流");
                // 存储带码流标识的RTMP URL (子码流为1)
                subStreamItem->setData(0, Qt::UserRole, rtmp + "1");

                // 根据设备类型添加到对应分组
                if (type == 0) {
                    ballMachineItem->addChild(deviceItem);
                } else if (type == 1) {
                    gunCameraItem->addChild(deviceItem);
                } else {
                    // 默认添加到球机分组
                    ballMachineItem->addChild(deviceItem);
                }
            }
        }
    } else {
        qDebug() << "Failed to parse device list JSON or invalid format";
    }
}

QString ControlPanel::getSelectedDevice() const
{
    // 获取当前选中的设备
    QTreeWidgetItem *currentItem = deviceTree->currentItem();
    if (currentItem) {
        return currentItem->data(0, Qt::UserRole).toString();
    }
    return "";
}

QString ControlPanel::getSelectedStreamType() const
{
    // 获取当前选中的流类型
    // 这里简化处理，返回默认的主码流
    return "main";
}

void ControlPanel::onDeviceItemClicked(QTreeWidgetItem *item, int column)
{

    QString deviceId = item->data(0, Qt::UserRole).toString();
    qDebug() << deviceId ;

    // 设备树项被点击时触发
    // 获取设备信息并发出deviceSelected信号
    if (item && item->data(0, Qt::UserRole).toString().startsWith("group_") == false) {
        // 只有非分组项才发出信号
        QString deviceId = item->data(0, Qt::UserRole).toString();

        QString streamType = "main"; // 默认主码流
        emit deviceSelected(deviceId, streamType);

        // 同时发射dragVideoStream信号
        emit dragVideoStream(deviceId);
    }

    // 避免未使用参数警告
    (void)column;
}
